/*
 * 文件名：ResponseResult.java
 * 版权：Copyright 2018 Kdla. Co. Ltd. All Rights Reserved.
 * 描述：云通物联云平台V3.0
 * 修改人：hiny
 * 修改时间：2018年6月15日
 */

package com.common.boot.util;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.common.boot.exception.ExceptionStatus;
import lombok.Data;

import java.awt.*;
import java.util.ArrayList;

/**
 * 结果返回model
 *
 * @author hiny
 * @version 1.0 2018年6月15日
 * @see ResponseResult
 */
@Data
public class ResponseResult<T> {

    /**
     * 返回码
     */
    private String status;

    /**
     * 信息提示
     */
    private String info;

    /**
     * 返回信息总数
     */
    private long total;

    /**
     * 数据
     */
    private T data;

    public static Builder builder() {
        return new Builder<>();
    }

    /**
     * 构造函数
     *
     * @param status 返回码
     * @param info   信息提示
     * @param total  返回信息总数
     * @param data   数据
     */
    public ResponseResult(String status, String info, long total, T data) {
        this.status = status;
        this.info = info;
        this.total = total;
        this.data = data;
    }

    /**
     * 构造函数
     * @param status 返回码
     * @param info 信息提示
     * @param data 数据
     */
    public ResponseResult(String status, String info, T data) {
        this.status = status;
        this.info = info;
        this.data = data;
    }

    /**
     * 构造函数(只传入状态码和数据)
     *
     * @param status 返回码
     * @param data   数据
     */
    public ResponseResult(String status, T data) {
        // todo（严重问题） 临时解决方案，在不为 200 的情况下，data能转string情况下，兼容异常情况，直接传状态码和提示
        if (status != ResponseCode.I_200 && data instanceof String) {
            this.info = (String) data;
        }
        this.status = status;
        this.data = data;
        if (null != data) {
            if (ResponseCode.class.equals(data.getClass().getSuperclass())
                    || ResponseCode.class.equals(data.getClass())) {
                this.status = (String) data;
            } else if (List.class.equals(data.getClass())) {
                this.total = ((List) data).getRows();
            } else if (ArrayList.class.equals(data.getClass())) {
                this.total = ((ArrayList<?>) data).size();
            } else if (Page.class.equals(data.getClass())) {
                this.total = ((IPage<?>) data).getTotal();
                this.data = (T) ((IPage<?>) data).getRecords();
            }
        }
/*
        // todo（严重问题） 临时解决方案，在不为 200 的情况下，data能转string情况下，兼容异常情况，直接传状态码和提示
        String configMsg = MessagePropertyUtils.getInfo(String.valueOf(status));
        if (StrUtil.isNotEmpty(configMsg)){
            this.info =configMsg;
        }else {
            if (StrUtil.isEmpty(this.info)){
                this.info = "未知异常";
            }
        }*/
    }

    /**
     * 构造函数(只传入数据,默认状态200或者只传入状态)
     *
     * @param data 数据
     */
    public ResponseResult(T data) {
        this(ResponseCode.I_200, data);
    }

    public ResponseResult(ExceptionStatus code) {
        this.status = code.getCode();
        this.info = code.getMsg();
    }

    /**
     * 构造函数
     */
    public ResponseResult() {
        this(ResponseCode.I_200, null);
    }


    public static class Builder<T> {

        /**
         * 返回码
         */
        private String status = ResponseCode.I_200;

        /**
         * 信息提示
         */
        private String info;

        /**
         * 返回信息总数
         */
        private long total;

        /**
         * 数据
         */
        private T data;


        public Builder info(String info) {
            this.info = info;
            return this;
        }

        public Builder total(long total) {
            this.total = total;
            return this;
        }

        public Builder data(T data) {
            this.data = data;
            return this;
        }

    }
}
